package com.gxa.utils;

import com.gxa.common.exception.UnExceptFileUploadException;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

public class FileUtils {
    private FileUtils() {
    }

    private static final String ROOT_PATH = "/upload";
    private static final String DRUG_FILE_PATH = ROOT_PATH + "/images/drug_avatar/";
    private static final String USER_AVATAR_PATH = ROOT_PATH + "/images/user_avatar/";
    private static final String FILE_PATH = ROOT_PATH + "/file/";


    public static final Integer DRUG_AVATAR = 0;
    public static final Integer USER_AVATAR = 1;



    /**
     * 根据类型的不同上传
     *
     * @param file    要上传的文件
     * @param request 要获取的Request请求
     * @param type    上传的类型，药品或者是用户的头像，不能超过1mb
     * @return 上传后的路径
     */
    public static String saveImage(MultipartFile file, HttpServletRequest request, Integer type) {
        boolean fileCheck = checkFile(file.getOriginalFilename());
        String path = null;
        if (fileCheck) {
            if (DRUG_AVATAR.equals(type)) {
                path = DRUG_FILE_PATH;
            }
            if (USER_AVATAR.equals(type)) {
                path = USER_AVATAR_PATH;
            }
            if (path == null) {
                throw new UnExceptFileUploadException("不可以上传这种文件！没有对应的文件路径！请注意后台的信息");
            }
        } else {
            throw new UnExceptFileUploadException("不可以上传这种文件！没有对应的文件路径！请注意后台的信息");
        }
        return saveFile(file, request, path);
    }

    /**
     * 获取扩展名
     *
     * @param fileName
     * @return 文件扩展验证
     */
    private static boolean checkFile(String fileName) {
        //设置允许上传文件类型
        String suffixList = "jpg,png,ico,bmp,jpeg";
        // 获取文件后缀
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
        if (suffixList.contains(suffix.trim().toLowerCase())) {
            return true;
        }
        return false;
    }

    /**
     * 修改文件，根据以前的文件名删除文件，然后重新上传一个文件
     *
     * @param file 新的文件
     * @param path 之前用户头像的路径（可以通过数据库获得）
     * @return 新的文件路径
     */
    public static String updateImgFile(MultipartFile file, HttpServletRequest request, String path, Integer type) {
        //检查文件类型
        boolean isImage = checkFile(file.getOriginalFilename());
        if (isImage) {
            // 获取文件上传到具体文件夹的绝对路径
            String realpath = request.getServletContext().getRealPath(path);
            System.out.println("realpath   " +realpath);
            // 删除文件
            deleteFile(realpath);
            return saveImage(file, request, type);
        } else {
            throw new UnExceptFileUploadException("错误的文件类型！");
        }
    }

    /**
     * 根据文件路径
     *
     * @param path    路径
     * @return 是否删除成功
     */
    public static void deleteFile(String path) {
        try {
            System.out.println(path);
            File file = new File(path);
            //有文件就删除
            if (file.exists()) {
                System.out.println("有这个文件====================================");
                file.delete();
            }else {
                System.out.println("没有这个文件===================================");
            }
            //没有就算了
        } catch (Exception e) {
            throw new UnExceptFileUploadException("删除文件时出现问题！具体问题：" + e.getMessage());
        }
    }

    /**
     * 单个文件的上传
     *
     * @param file 要上传的文件
     * @return 文件名 saveFile(file,req,FILE_PATH)
     */
    public static String saveFile(MultipartFile file, HttpServletRequest request, String path) {
        try {
            // 获取文件上传到具体文件夹的绝对路径
            String realpath = request.getServletContext().getRealPath(path);
            // 获取上传的文件名
            String fileName = file.getOriginalFilename();
            //为了确保上传文件的重名问题，对文件名进行处理
            fileName = UUID.randomUUID().toString() + "_" + fileName;
            // 根据路径构建文件对象
            // 在构建过程中一定要注意路径问题
            File uploadFile = new File(realpath, fileName);
            // 判断指定文件夹uploadfiles是否存在，不存在就创建
            if (!uploadFile.exists()) {
                uploadFile.mkdirs();
            }
            file.transferTo(uploadFile);
            return path + fileName;
        } catch (IOException e) {
            throw new RuntimeException("文件上传错误！具体信息：" + e);
        }
    }
}
